package com.woniuxy.myshop.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.woniuxy.myshop.entity.Product;
import com.woniuxy.myshop.mapper.ProductMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Service
public class ProductService {

    @Autowired
    ProductMapper productMapper ;

    //@Cacheable(value = "product",key = "#root.target+#root.method.name+#a0+#a1+#a2")
    @Cacheable(value = "product",keyGenerator = "wugd")
    public PageInfo<Product> queryByPage(Integer now, Integer size, String pname) {
        PageHelper.startPage(now,size) ;
        List<Product> list = productMapper.selectProductByName(pname);

        return new PageInfo<>(list);
    }
    /*
       查询时 先查询 缓存中数据 ，如果缓存中没有数据  查询数据库
       查询完数据库之后 ，把查询的数据 存储到缓存
       使用在查询 方法上
     */
    @Cacheable(value = "product" ,key = "#id")
    public Product queryProductByKey(int id) {
        return productMapper.selectByPrimaryKey(id);
    }

    /*
      先执行方法 ，修改之后
      在把修改之后的对象  存储到缓存
      使用在  insert  或者 update
      注意 ：方法必须有返回值
     */
    //@CachePut(value = "product",key = " #a0.id")
    //allEntries ： true  删除缓存中是所有数据
    @CacheEvict(value = "product",allEntries = true)
    public Product modify(Product product) {
        productMapper.updateByPrimaryKey(product);
        return product ;
    }
    /*
      在删除数据库之后， 把缓存中的数据  一起删除
      先删除 缓存   先删除数据库 ???  由 beforeInvocation 决定
      可以使用在 增删改
     */
    @CacheEvict(value = "product",key = "#id")
    public int removeByKey(int id){
        int i = productMapper.deleteByPrimaryKey(id);
        return  i ;
    }
}
